package com.sun.action;

import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONObject;

import org.apache.log4j.Logger;
import org.apache.struts2.interceptor.ParameterAware;
import org.springframework.context.ApplicationContext;

import com.alipay.config.AlipayConfig;
import com.alipay.sign.RSA;
import com.opensymphony.xwork2.ActionSupport;
import com.sun.dao.NoticeInfoMapper;
import com.sun.po.NoticeInfo;
import com.sun.timer.TimeTick;
import com.sun.util.ApplicationContextFactory;

public class AlipayAction extends ActionSupport implements ParameterAware {

	private Map<String, String[]> parameters; //接收参数
	private Logger logger  =  Logger.getLogger(AlipayAction.class);
	private Map<String, String> dataMap;
	
	public Map<String, String> getDataMap() {
		return dataMap;
	}

	public void setDataMap(Map<String, String> dataMap) {
		this.dataMap = dataMap;
	}

	@Override
	public void setParameters(Map<String, String[]> arg0) {
		// TODO Auto-generated method stub
		this.parameters = arg0;
		
	}
	
	public String payTrade(){
		String[] params = parameters.get("out_trade_no");
		if(params == null){
			logger.error("trade no is null");
			dataMap.put("code", "-1");
			dataMap.put("desc", "no trade number!");
			return SUCCESS;
		}
		String strTradeNo = new String(params[0]);

		Map<String, String> parmmap = getBaseAlipayMap();
		// 商品名称
		parmmap.put("subject", "测试");
		// 支付类型，默认1
		parmmap.put("payment_type", "1");
		// 金额
		parmmap.put("total_fee", "0.01");
		// 商品详情
		parmmap.put("body", "商品详情：测试中");

		// 订单号
		parmmap.put("out_trade_no", strTradeNo);

		// 获取未签名字符串
		String unsingedStr = getUnsignedStr(parmmap);
		//String unsingedStr = getOrderInfo("测试的商品", "该测试商品的详细描述", "0.01", strTradeNo);
			
		String signed = "";
		String sign = RSA.sign(unsingedStr, AlipayConfig.private_key,
				"utf8");
		try {
			sign = URLEncoder.encode(sign, "utf-8");
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		parmmap.put("sign", sign);
		System.out.println(sign);
		parmmap.put("sign_type", "RSA");
		
		dataMap = parmmap;

		return SUCCESS;
	}
	
	private HashMap<String, String> getBaseAlipayMap() {
		HashMap<String, String> parmmap = new HashMap<String, String>();
		// 调用接口
		parmmap.put("service", "mobile.securitypay.pay");
		// 阿里合作者ID
		parmmap.put("partner", AlipayConfig.partner);
		parmmap.put("_input_charset", "utf-8");
		// 异步返回通知url
		parmmap.put("notify_url", AlipayConfig.notifiy_url);
		// 卖家支付宝账号
		parmmap.put("seller_id", "nbagaochao@126.com");
		return parmmap;
	}
	
	public String getOrderInfo(String subject, String body, String price, String trade) {

		// 签约合作者身份ID
		String orderInfo = "partner=" + "\"" + AlipayConfig.partner + "\"";

		// 签约卖家支付宝账号
		orderInfo += "&seller_id=" + "\"nbagaochao@126.com\"";

		// 商户网站唯一订单号
		orderInfo += "&out_trade_no=" + "\"" + trade + "\"";

		// 商品名称
		orderInfo += "&subject=" + "\"" + subject + "\"";

		// 商品详情
		orderInfo += "&body=" + "\"" + body + "\"";

		// 商品金额
		orderInfo += "&total_fee=" + "\"" + price + "\"";

		// 服务器异步通知页面路径
		orderInfo += "&notify_url=" + "\"" + "http://notify.msp.hk/notify.htm"
				+ "\"";

		// 服务接口名称， 固定值
		orderInfo += "&service=\"mobile.securitypay.pay\"";

		// 支付类型， 固定值
		orderInfo += "&payment_type=\"1\"";

		// 参数编码， 固定值
		orderInfo += "&_input_charset=\"utf-8\"";

		// 设置未付款交易的超时时间
		// 默认30分钟，一旦超时，该笔交易就会自动被关闭。
		// 取值范围：1m～15d。
		// m-分钟，h-小时，d-天，1c-当天（无论交易何时创建，都在0点关闭）。
		// 该参数数值不接受小数点，如1.5h，可转换为90m。
		orderInfo += "&it_b_pay=\"30m\"";

		// extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付
		// orderInfo += "&extern_token=" + "\"" + extern_token + "\"";

		// 支付宝处理完请求后，当前页面跳转到商户指定页面的路径，可空
		orderInfo += "&return_url=\"m.alipay.com\"";

		// 调用银行卡支付，需配置此参数，参与签名， 固定值 （需要签约《无线银行卡快捷支付》才能使用）
		// orderInfo += "&paymethod=\"expressGateway\"";

		return orderInfo;
	}
	
	private String getUnsignedStr(Map<String, String> parmmap) {
		String unsigned = "";
		for (Map.Entry<String, String> en : parmmap.entrySet()) {
			unsigned = unsigned + en.getKey() + "=\"" + en.getValue() + "\"&";
		}
		unsigned = unsigned.substring(0, unsigned.length() - 1);
		return unsigned;
	}

}
